package com.one.controller;

import com.netflix.eureka.resources.VIPResource;
import com.one.annotation.RequestUser;
import com.one.bean.User;
import com.one.constant.WechatPayConstant;
import com.one.service.WechatPayService;


import com.one.util.*;
import com.one.vo.UserVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: tzy
 * @create: 2022/1/4
 * @FileName: WechatPayController
 * @Description: 会员购买微信支付操作入口
 */
@Slf4j
@RestController
@RequestMapping("/wxpay")
public class WechatPayController {
    @Autowired
    private WechatPayService wechatPayService;
    @Autowired
    private RedisUtils redisUtils;
    /**
     * @author: tzy
     * @date: 2022/1/4
     * @return:
     * @Description: 请求微信官方进行统一下单（拿到付款的url链接）
     */
    @PostMapping("/unifiedOrder")
    public RequestReturn<Map<String, String>> wechatPayUnifiedOrder(@RequestHeader String token,@RequestParam(value = "num",required = false) Integer num) throws Exception{

        //@RequestParam("body") String body, @RequestParam("totalFee") Integer totalFee,

        String body = "购买会员";
        int totalFee = 1;
        if (num != null){
            totalFee = 1*num;
        }
        //int userId = userVo.getUserId();
        // 生成到微信官方统一下单的请求xml参数字符串
        String unifiedOrderParamsXml = wechatPayService.wechatPayUnifiedOrderParamsXml(body, totalFee,token);

        log.info("------ 1、请求微信统一下单参数xml：{} ------", unifiedOrderParamsXml);

        // 请求微信官方，统一下单
        Map<String, String> unifiedOrderReturnMap = wechatPayService.wechatPayUnifiedOrder(unifiedOrderParamsXml);

        log.info("------ 2、请求微信统一下单返回map：{} ------", unifiedOrderReturnMap);

        // 自定义返回结果集合
        Map<String, String> unifiedOrderResultMap = new HashMap<>();

        // 解析返回结果，获取支付链接
        if(WechatPayConstant.WECHAT_PAY_RETURN_CODE_SUCCESS.equals(unifiedOrderReturnMap.get("return_code"))
                && WechatPayConstant.WECHAT_PAY_RESULT_CODE_SUCCESS.equals(unifiedOrderReturnMap.get("result_code"))){
            // 支付成功返回
            // 交易类型
            unifiedOrderResultMap.put("trade_type", unifiedOrderReturnMap.get("trade_type"));
            // 预支付交易会话标识
            unifiedOrderResultMap.put("prepay_id", unifiedOrderReturnMap.get("prepay_id"));
            // 二维码链接
            unifiedOrderResultMap.put("code_url", unifiedOrderReturnMap.get("code_url"));

            // 请求成功返回
            return RequestReturnFactory.success(unifiedOrderResultMap);
        }

        // 请求失败返回
        return RequestReturnFactory.fail(Integer.valueOf(unifiedOrderReturnMap.get("return_code")), unifiedOrderReturnMap.get("return_msg"));

    }

    /**
     * @author: tzy
     * @date: 2022/1/17
     * @return: void
     * @Description: 接收微信官方支付结果回调
     */
    @RequestMapping("/unifiedNotify")
    public void wechatPayUnifiedNotify(HttpServletRequest request, HttpServletResponse response){

        // 获取微信异步通知结果（支付完成后，微信会把相关支付结果及用户信息通过数据流的形式发送给商户，商户需要接收处理）
        try(InputStream inputStream = request.getInputStream()) {

            // 读取流数据
            BufferedReader bfr = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));

            // 定义读取临时变量
            String readLine;

            // 定义保持数据的可变字符串对象
            StringBuilder unifiedNotifyResultXml = new StringBuilder();

            // 循环读取返回结果
            while((readLine = bfr.readLine()) != null){
                unifiedNotifyResultXml.append(readLine);
            }

            log.info("------ 3、微信异步通知结果：{} ------", unifiedNotifyResultXml);

            // 解析异步通知结果
            String unifiedNotifyResponseXml = wechatPayService.wechatPayUnifiedNotifyResole(unifiedNotifyResultXml.toString());

            // 同步返回给微信官方处理结果
            PrintWriter out = response.getWriter();
            out.write(unifiedNotifyResponseXml);
            out.flush();
            out.close();
            log.info("------ 4、微信异步通知，同步返回结果：{} ------", unifiedNotifyResponseXml);

        } catch (Exception e){
            log.warn("------ 5、微信异步通知处理异常，异常信息为：{} ------", e.getMessage());
        }
    }


    /**
     * @author: tzy
     * @date: 2022/1/21
     * @return:
     * @Description: 查询当前用户的会员到期时间
     */
    @GetMapping("/queryUserMemberDate")
    public RequestReturn<String> queryUserMemberDate(@RequestUser UserVo userVo){
        if (wechatPayService.findUserMemberDate(userVo) == null){
            return RequestReturnFactory.success("您不是会员，请购买会员后重试！");
        }
        return RequestReturnFactory.success("您的会员到期时间为：" + wechatPayService.findUserMemberDate(userVo));
    }

//    /**
//     * @author: tzy
//     * @date: 2022/1/17
//     * @return:
//     * @Description: 获取用户信息和购买的时长将数据存入redis
//     */
//    @GetMapping("addUserVip")
//    public String addUserVip(@RequestUser UserVo userVo){
//        //在redis中查询是否存在用户会员的key
//        if (redisUtils.hasKey(userVo.getUserId() + "-vip")){
//            log.info("------ 往redis中添加用户会员信息,信息存在,增加时长 ------");
//            //会员未过期，添加会员时长
//            Long time = null;
//            time = redisUtils.getExpire(userVo.getUserId() + "-vip");
//            redisUtils.expire(userVo.getUserId() + "-vip",time + 604800);
//            return "成功";
//        }
//        //用户不是会员，添加会员信息
//        log.info("------ 往redis中添加用户会员信息,信息不存在,创建用户vip信息 ------");
//        redisUtils.set(userVo.getUserId() + "-vip",null,604800);
//
//        return "失败";
//    }
//
//    @GetMapping("findUserVip")
//    public Long findUserVip(String token){
//        return redisUtils.getExpire("VIP:1");
//    }


//    @GetMapping("/test")
//    public void testRedis(){
//        redisUtils.set("2-vip",null,604800);
//        log.info("------ 过期时间:{} ------",redisUtils.getExpire("2-vip"));
//    }

//    /**
//     * @author: tzy
//     * @date: 2022/1/17
//     * @return:
//     * @Description: cron表达式，每隔5s执行一次定时任务,更新用户会员信息
//     */
//    @Scheduled(cron = "*/5 * * * * ?") //每隔5s执行一次，且必须是整5s
//    public void asyncChargeUserVipCallBackMethod(@RequestUser UserVo userVo){
//        //开始进行定时回调
//        log.info("------ 开始进行更新用户会员信息结果回调 ------");
//        //创建user对象
//        User user = new User();
//        //更新用户会员信息
//        if (redisUtils.hasKey(userVo.getUserId() + "-" + "vip")){
//            //用户是会员，更新user表
//            user.setId(userVo.getUserId());
//            user.setMember(true);
//            wechatPayService.modUser(user);
//            log.info("------ 结束进行更新用户会员信息结果回调 ------");
//            log.info("------ 更新用户会员信息成功，用户是会员 ------");
//            return;
//        }
//        user.setId(userVo.getUserId());
//        user.setMember(false);
//        wechatPayService.modUser(user);
//        log.info("------ 结束进行更新用户会员信息结果回调 ------");
//        log.info("------ 更新用户会员信息成功，用户不是会员 ------");
//        return;
//    }


}
